﻿namespace LogicStudio.Framework.UI.Comun
{
    using System.Windows.Controls;
    using System.Windows.Input;

    /// <summary>
    /// Objeto auxiliar que se usa como contexto para el editor genérico
    /// </summary>
    /// <typeparam name="TEntidad">
    /// Tipo de la entidad principal a procesarce
    /// </typeparam>
    /// <typeparam name="TContexto">
    /// Contexto actual de datos
    /// </typeparam>
    public interface IObjetoModelo<out TContexto, out TEntidad>
    {
        #region Propiedades

        bool AplicarGrabado { set; }

        bool EstaProcesando { get; set; }

        bool HabilitadoModificacion { get; set; }

        ICommand AccionDetalle { get; }

        ICommand AccionGrabar { get; }

        ModoEntidad Modo { get; set; }

        string NombreEntidad { get; }

        TEntidad ItemSeleccionado { get; }

        TContexto Contexto { get; }

        #endregion

        #region Eventos

        /// <summary>
        /// Método para sobreescribir las propiedades de generación del formulario de edición
        /// </summary>
        /// <param name="sender">Objeto que se encuentra generando dinamicamente el formulario</param>
        /// <param name="e">Atributo que se encuentra en generación</param>
        void PersonalizarEditor(object sender, DataFormAutoGeneratingFieldEventArgs e);

        /// <summary>
        /// Método de validacion para la acción del detalle
        /// </summary>
        /// <param name="parametro">
        /// Parametro configurable por el usuario para valiedar la acción del detalle
        /// </param>
        void AplicarAccionDetalle(object parametro);

        /// <summary>
        /// Método para la implementación de la validacion de los detalles
        /// </summary>
        /// <returns>
        /// Un dato binario que se indica si se cumple o no con la validación de los detalles
        /// </returns>
        bool ValidarItems();

        #endregion
    }
}